Paul SPIELMANN Hani HOUMIMID
Rapport des données du BUT RT de ParcoursSup :
L'objectif principal de cette analyse est de générer un classement des candidats en vue de l'admission dans la formation RT. Ce classement est basé sur divers critères, qui seront détaillés ultérieurement. Il servira à sélectionner les candidats qui rejoindront la formation RT en cas où ils ne choisissent pas une autre formation.
Pour mener cette étude, nous avons utilisé les données du BUT RT de l'année académique 2021/2022. Le fichier Excel contient une gamme d'informations sur les candidats, comprenant leur parcours scolaire (français/étranger), la présence éventuelle de dispositifs d'aménagement, l'établissement d'origine des candidats, leur filière, leurs bulletins scolaires avec les notes associées, leurs spécialités ainsi que les langues vivantes choisies par les étudiants.
Ce bout de code nous permet de charger les bibliothèques python qui vont nous servir pour notre analyse de données et notre classement.
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import math as math
from scipy.stats import chi2_contingency
import warnings
warnings.filterwarnings('ignore')
df = pd.read_excel('RT_Anonyme.xlsx')
df = pd.DataFrame(df) #Création de la DataFrame 'df' qui nous servira tout au long de notre projet
# Calcul du nombre total de voeux
total_voeux = len(df)
# Filtrer les voeux non confirmés et confirmés
voeux_non_confirmes = df[df['Vœu confirmé - Libellé'] == 'Non validée']
voeux_confirmes = df[df['Vœu confirmé - Libellé'] == 'Validée']
# Nombre de voeux non confirmés
nb_voeux_non_confirmes = len(voeux_non_confirmes)
# Nombre de voeux confirmés
nb_voeux_confirmes = len(voeux_confirmes)
# Répartition des voeux confirmés par type de baccalauréat
repartition_confirmes = voeux_confirmes[' Niveau Etude - Libellé 2020/2021'].value_counts()
# Affichage des résultats
print("Nombre de voeux total :", total_voeux)
print("Nombre de voeux non confirmés :", nb_voeux_non_confirmes)
print("Nombre de voeux confirmés :", nb_voeux_confirmes)
print("\tRépartition :")
for bac, count in repartition_confirmes.items():
print(f"\t {count} {bac}")
Nombre de voeux total : 2520 Nombre de voeux non confirmés : 236 Nombre de voeux confirmés : 2284 Répartition : 1650 Seconde 393 Première 122 Terminale 46 1ère année d'études supérieures 14 2nd année d'études supérieures 8 3ème année d'études supérieures 7 Troisième 2 Non scolarisé
# Filtrer les données pour ne conserver que les lignes correspondant à "Terminale"
df_terminale = df[df[' Niveau Etude - Libellé 2022/2023'] == 'Terminale'].copy()
# Fonction pour regrouper les séries de classe en catégories
def regrouper_serie(serie):
if 'Série générale' in serie or 'Générale' in serie:
return 'Bac générale'
elif 'Sciences et Technologies de l\'Industrie et du Développement Durable' in serie or 'Sciences et Technologies du Management et de la Gestion' in serie or 'Sciences et technologies de la santé et du social' in serie or 'Sciences et technologie de laboratoire' in serie:
return 'Bac Technologique'
elif 'Professionnelle' in serie:
return 'Bac professionnel'
else:
return 'Autre'
# Appliquer la fonction de regroupement aux données
df_terminale['Série regroupée'] = df_terminale['Série de classe - Libellé 2022/2023'].apply(regrouper_serie)
# Compter le nombre d'occurrences de chaque valeur regroupée
repartition_serie = df_terminale['Série regroupée'].value_counts()
# Tracer le diagramme circulaire
plt.figure(figsize=(8, 8))
plt.pie(repartition_serie, labels=repartition_serie.index, autopct='%1.1f%%', startangle=140)
plt.title('Répartition des séries de classe en Terminale')
plt.axis('equal')
plt.show()
# Comptage des voeux confirmés et non confirmés
valide_counts = df['Vœu confirmé - Libellé'].value_counts()
# Comptage des sexes
sexe_counts = df['Sexe'].value_counts()
# Comptage des formations
formation_counts = df['Type Formation - Libellé 2022/2023'].value_counts()
eds_abandon = df['EDS Scolarité Première 1 - Libellé'].value_counts()
bourse_counts = df['Candidat boursier - Libellé'].value_counts()
# Tracé des diagrammes circulaires
fig, axs = plt.subplots(2, 2, figsize=(15, 10))
# Diagramme circulaire pour les voeux confirmés ou non
axs[0, 0].pie(valide_counts, labels=valide_counts.index, autopct='%1.1f%%')
axs[0, 0].set_title('Répartition des voeux Parcoursup validés')
# Diagramme circulaire pour les sexes
axs[0, 1].pie(sexe_counts, labels=sexe_counts.index, autopct='%1.1f%%')
axs[0, 1].set_title('Répartition des genres')
# Diagramme circulaire pour le type de scolarité
scolarite_counts = df['Type de Scolarité - Libellé 2022/2023'].fillna('Non renseignée').value_counts()
axs[1, 0].pie(scolarite_counts, labels=scolarite_counts.index, autopct='%1.1f%%')
axs[1, 0].set_title('Répartition du type de scolarité')
#Diagramme circulaire pour les boursiers
axs[1,1].pie(bourse_counts, labels = bourse_counts.index, autopct='%1.1f%%')
axs[1,1].set_title('Répartition des boursiers et des non boursiers')
plt.show()
# Filtrer les valeurs non nulles dans la colonne spécifiée et prendre les 10 premières
filiere_counts = df['Filiere (pour scolarité du supérieur)- Libellé 2022/2023'].value_counts().dropna().head(20)
# Inverser les données et les libellés
filiere_counts = filiere_counts[::-1]
# Créer un diagramme en barres
plt.figure(figsize=(12, 6))
plt.barh(filiere_counts.index, filiere_counts.values, color='skyblue')
plt.title('Répartition des étudiants selon la filière')
plt.xlabel('Nombre d\'étudiants')
plt.ylabel('Filière')
plt.grid(axis='x', linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()
# Remplacer les valeurs vides par "pas d'infos"
df['Aménagement'].fillna('Non renseigné', inplace=True)
# Compter les occurrences des valeurs dans la colonne 'Aménagement'
amenagement_counts = df['Aménagement'].value_counts()
# Créer un camembert
plt.figure(figsize=(8, 8))
plt.pie(amenagement_counts.values, labels=amenagement_counts.index, autopct='%1.1f%%', startangle=140)
plt.title('Répartition des personnes avec ou sans aménagement')
plt.axis('equal') # L'aspect égal garantit que le camembert est dessiné comme un cercle.
plt.show()
# Répartition des voeux confirmés par niveau d'études
repartition_confirmes = voeux_confirmes[' Niveau Etude - Libellé 2020/2021'].value_counts()
# Créer un diagramme en barres
plt.figure(figsize=(10, 6))
repartition_confirmes.plot(kind='bar', color='skyblue')
plt.title('Répartition des niveaux d\'études des voeux confirmés')
plt.xlabel('Niveau d\'études')
plt.ylabel('Nombre de voeux confirmés')
plt.xticks(rotation=45, ha='right')
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()
# Obtenez les comptages des valeurs uniques dans la colonne 'EDS Scolarité Première 1 - Libellé'
eds_abandon = df['EDS Scolarité Première 1 - Libellé'].value_counts()
# Limitez le nombre de catégories à afficher pour des raisons de lisibilité
eds_abandon = eds_abandon.head(21)
# Créer un diagramme en barres
plt.figure(figsize=(12, 6))
eds_abandon.plot(kind='bar', color='skyblue')
plt.title('Répartition des enseignements de spécialité abandonnés')
plt.xlabel('Type d\'abandon')
plt.ylabel('Nombre de cas')
plt.xticks(rotation=45, ha='right')
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()
# Remplacer les valeurs "Pas d'infos" par "Non précisé"
df['Langue vivante A scolarité - Libellé 2022/2023'].replace('Pas d\'infos', 'Non précisé', inplace=True)
# Compter les occurrences des valeurs
langue_counts = df['Langue vivante A scolarité - Libellé 2022/2023'].value_counts()
# Calculer le pourcentage de chaque langue
pourcentages = langue_counts / langue_counts.sum()
# Séparer les principales langues (75% et 20%) du reste
langues_principales = pourcentages[:2]
autres_langues = pourcentages[2:].sum()
# Créer une liste avec les pourcentages
pourcentages_final = list(langues_principales.values) + [autres_langues]
# Créer une liste avec les labels
labels = list(langues_principales.index) + ['Autres']
# Créer un diagramme circulaire
plt.figure(figsize=(8, 8))
plt.pie(pourcentages_final, labels=labels, autopct='%1.1f%%', startangle=140)
plt.title('Répartition des langues vivantes A scolarité')
plt.axis('equal') # L'aspect égal garantit que le camembert est dessiné comme un cercle.
plt.show()
Pour avoir une visualisation un peu plus précise des langues vivantes :
# Remplacer les valeurs "Pas d'infos" par "Non précisé"
df['Langue vivante A scolarité - Libellé 2022/2023'].replace('Pas d\'infos', 'Non précisé', inplace=True)
# Compter les occurrences des valeurs
langue_counts = df['Langue vivante A scolarité - Libellé 2022/2023'].value_counts()
# Créer un diagramme en barres
plt.figure(figsize=(12, 6))
langue_counts.plot(kind='bar', color='skyblue')
plt.title('Répartition des langues vivantes A scolarité')
plt.xlabel('Langue')
plt.ylabel('Nombre d\'étudiants')
plt.xticks(rotation=45, ha='right')
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()
Notre fichier ne contenait pas les académies d'origine de nos étudiants, nous avons créer un graphe circulaire afin d'observer la répartition.
Notons que nous avons cité seulement les académoies d'Ile-De-France car notre graphe allait être illisible si nous avions affiché les autres académies.
Les autres académies sont représenté sous le libellé "Autre".
Le premier graphe circulaire montre la répartition des académies d'origine sans aucun filtre
Le deuxième graphe circulaire montre la répartition des académies d'origine seulement pour les étudiants ayant validés leur voeux
# Dictionnaire associant les deux premiers chiffres du code postal à l'académie correspondante
codepostal_academie = {
'75': 'Académie de Paris',
'77': 'Académie de Créteil',
'78': 'Académie de Versailles',
'91': 'Académie de Versailles',
'92': 'Académie de Versailles',
'93': 'Académie de Créteil',
'94': 'Académie de Créteil',
'95': 'Académie de Versailles'
}
# Fonction pour obtenir l'académie à partir du code postal
def get_academie_from_codepostal(codepostal):
if pd.notnull(codepostal):
codepostal = str(codepostal)[:2]
return codepostal_academie.get(codepostal, 'Autre')
return None
# Ajout de la colonne "Académie" au DataFrame
df['Académie'] = df['Commune Etablissement origine - CodePostal 2021/2022'].apply(get_academie_from_codepostal)
# Dictionnaire des codes postaux par académie en Île-de-France
codes_postaux_par_academie = {}
# Dictionnaire associant les deux premiers chiffres du code postal à l'académie correspondante
codepostal_academie = {
'75': 'Académie de Paris',
'77': 'Académie de Créteil',
'78': 'Académie de Versailles',
'91': 'Académie de Versailles',
'92': 'Académie de Versailles',
'93': 'Académie de Créteil',
'94': 'Académie de Créteil',
'95': 'Académie de Versailles'
}
# Remplir le dictionnaire en classant les codes postaux dans les académies respectives
for codepostal in df['Commune Etablissement origine - CodePostal 2021/2022']:
if pd.notnull(codepostal): # Vérifier si le code postal n'est pas manquant
codepostal = str(codepostal)[:2] # Extraire les deux premiers chiffres du code postal
academie = codepostal_academie.get(codepostal, 'Autre') # Récupérer l'académie correspondante ou 'Autre' si le code postal n'est pas dans le dictionnaire
codes_postaux_par_academie.setdefault(academie, []).append(codepostal) # Initialiser une liste vide si l'académie n'existe pas dans le dictionnaire et ajouter le code postal à la liste
# Afficher les codes postaux par académie
for academie, codes_postaux in codes_postaux_par_academie.items():
print("{} : {}".format(academie, len(codes_postaux)))
# Créer un diagramme circulaire montrant la répartition des codes postaux par académie
plt.figure(figsize=(10, 8))
plt.pie([len(codes_postaux) for codes_postaux in codes_postaux_par_academie.values()], labels=codes_postaux_par_academie.keys(), autopct='%1.1f%%', startangle=140)
plt.title('Répartition des académie d\'origine')
plt.axis('equal')
plt.show()
Académie de Créteil : 950 Académie de Versailles : 898 Autre : 282 Académie de Paris : 235
Nous allons maintenant visualiser les données pour chaque académie :
def plot_genre_par_academie(ax, df_special, academie):
if academie is not None:
sexe_counts = df[df['Académie'] == academie]['Sexe'].value_counts()
ax.pie(sexe_counts, labels=sexe_counts.index, autopct='%1.1f%%')
ax.set_title('Répartition des genres - {}'.format(academie))
ax.axis('equal')
return True
return False
# Boucle pour créer les diagrammes circulaires pour chaque académie
academies = df['Académie'].unique()
academies = [academie for academie in academies if academie is not None]
# Calculer le nombre de lignes et de colonnes pour la grille
n = len(academies)
ncols = int(np.ceil(np.sqrt(n)))
nrows = int(np.ceil(n / ncols))
# Créer une figure avec des axes de taille (15, 10) pour les sous-graphiques
fig, axs = plt.subplots(nrows, ncols, figsize=(15, 10))
axs = axs.flatten() # pour faciliter l'itération
# Créer les diagrammes circulaires pour chaque académie
for i, academie in enumerate(academies):
plot_genre_par_academie(axs[i], df, academie)
# Supprimer les axes inutilisés
for j in range(i+1, len(axs)):
fig.delaxes(axs[j])
# Ajuster l'espacement entre les sous-graphiques
plt.tight_layout()
plt.show()
def plot_scolarite_par_academie(ax, df_special, academie):
if academie is not None:
scolarite_counts = df_special[df_special['Académie'] == academie]['Type de Scolarité - Libellé 2022/2023'].fillna('Non renseignée').value_counts()
ax.pie(scolarite_counts, labels=scolarite_counts.index, autopct='%1.1f%%')
ax.set_title('Répartition du type de scolarité - {}'.format(academie))
ax.axis('equal')
# Créer une figure avec des axes pour les 4 sous-graphiques (2 par ligne sur 2 lignes)
fig, axs = plt.subplots(2, 2, figsize=(12, 12))
# Boucle pour créer les diagrammes circulaires pour chaque académie
for i, academie in enumerate(academies):
plot_scolarite_par_academie(axs[i//2, i%2], df, academie)
# Ajuster l'espacement entre les sous-graphiques
plt.tight_layout()
plt.show()
def plot_series_distribution(df, academie, ax):
# Filtrer les données pour ne conserver que les lignes correspondant à "Terminale" et à une académie spécifique
df_terminale_academie = df[(df[' Niveau Etude - Libellé 2022/2023'] == 'Terminale') & (df['Académie'] == academie)].copy()
# Si le DataFrame est vide, ne pas tracer le diagramme
if df_terminale_academie.empty:
return
# Fonction pour regrouper les séries de classe en catégories
def regrouper_serie(serie):
if 'Série générale' in serie or 'Générale' in serie:
return 'Bac général'
elif 'Sciences et Technologies de l\'Industrie et du Développement Durable' in serie or 'Sciences et Technologies du Management et de la Gestion' in serie or 'Sciences et technologies de la santé et du social' in serie or 'Sciences et technologie de laboratoire' in serie:
return 'Bac Technologique'
elif 'Professionnelle' in serie:
return 'Bac professionnel'
else:
return 'Autre'
# Appliquer la fonction de regroupement aux données
df_terminale_academie['Série regroupée'] = df_terminale_academie['Série de classe - Libellé 2022/2023'].apply(regrouper_serie)
# Compter le nombre d'occurrences de chaque valeur regroupée
repartition_serie = df_terminale_academie['Série regroupée'].value_counts()
# Tracer le diagramme circulaire sur l'axe spécifié
ax.pie(repartition_serie, labels=repartition_serie.index, autopct='%1.1f%%', startangle=140)
ax.set_title('Répartition des séries de classe en Terminale - {}'.format(academie))
ax.axis('equal')
# Liste des académies dans votre DataFrame
academies_list = df['Académie'].unique()
# Supprimer les valeurs None
academies_list = academies_list[~pd.isnull(academies_list)]
# Calculer le nombre de lignes et de colonnes nécessaires pour les sous-graphiques
num_rows = (len(academies_list) + 1) // 2
num_cols = min(len(academies_list), 2)
# Créer une figure et des axes pour les sous-graphiques
fig, axs = plt.subplots(num_rows, num_cols, figsize=(12, 6 * num_rows))
# Tracer le diagramme circulaire pour chaque académie sur les axes correspondants
for i, academie in enumerate(academies_list):
plot_series_distribution(df, academie, axs[i//2, i%num_cols])
# Supprimer les axes inutilisés
for i in range(len(academies_list), num_rows * num_cols):
fig.delaxes(axs.flatten()[i])
# Ajuster l'espacement entre les sous-graphiques
plt.tight_layout()
plt.show()
def plot_filiere_par_academie(df, academie):
filiere_counts = df[df['Académie'] == academie]['Filiere (pour scolarité du supérieur)- Libellé 2022/2023'].value_counts().dropna().head(20)
filiere_counts = filiere_counts[::-1]
plt.figure(figsize=(12, 6))
plt.barh(filiere_counts.index, filiere_counts.values, color='skyblue')
plt.title('Répartition des étudiants selon la filière - {}'.format(academie))
plt.xlabel('Nombre d\'étudiants')
plt.ylabel('Filière')
plt.grid(axis='x', linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()
# Boucle pour créer les diagrammes en barres pour chaque académie
for academie in academies:
plot_filiere_par_academie(df, academie)
def plot_valide_par_academie(ax, df, academie):
if academie is not None:
counts = df[df['Académie'] == academie]['Vœu confirmé - Libellé'].value_counts()
if not counts.empty:
ax.pie(counts, labels=counts.index, autopct='%1.1f%%')
ax.set_title('Répartition des voeux Parcoursup validés - {}'.format(academie))
ax.axis('equal')
# Créer une figure avec des axes pour les 4 sous-graphiques (2 par ligne sur 2 lignes)
fig, axs = plt.subplots(2, 2, figsize=(12, 12))
# Boucle pour créer les diagrammes circulaires pour chaque académie
for i, academie in enumerate(academies):
plot_valide_par_academie(axs[i//2, i%2], df, academie)
# Ajuster l'espacement entre les sous-graphiques
plt.tight_layout()
plt.show()
def plot_bourse_par_academie(ax, df_special, academie):
if academie is not None:
bourse_counts = df_special[df_special['Académie'] == academie]['Candidat boursier - Libellé'].value_counts()
ax.pie(bourse_counts, labels=bourse_counts.index, autopct='%1.1f%%')
ax.set_title('Répartition des boursiers - {}'.format(academie))
ax.axis('equal')
# Créer une figure avec des axes pour les 4 sous-graphiques (2 par ligne sur 2 lignes)
fig, axs = plt.subplots(2, 2, figsize=(12, 12))
# Boucle pour créer les diagrammes circulaires pour chaque académie
for i, academie in enumerate(academies):
plot_bourse_par_academie(axs[i//2, i%2], df, academie)
# Ajuster l'espacement entre les sous-graphiques
plt.tight_layout()
plt.show()
def plot_confirmes_par_niveau_academie(df, academie):
# Filtrer les valeurs non nulles dans la colonne spécifiée pour l'académie donnée
repartition_confirmes = df[df['Académie'] == academie][' Niveau Etude - Libellé 2020/2021'].value_counts()
# Créer un diagramme en barres
plt.figure(figsize=(10, 6))
repartition_confirmes.plot(kind='bar', color='skyblue')
plt.title('Répartition des niveaux d\'études des voeux confirmés - {}'.format(academie))
plt.xlabel('Niveau d\'études')
plt.ylabel('Nombre de voeux confirmés')
plt.xticks(rotation=45, ha='right')
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()
# Boucle pour créer les diagrammes pour chaque académie
for academie in academies:
plot_confirmes_par_niveau_academie(df, academie)
def plot_etude_par_academie(df, academie):
etude_counts = df[df['Académie'] == academie][' Niveau Etude - Libellé 2022/2023'].value_counts()
plt.figure(figsize=(10, 8))
etude_counts.plot(kind='barh')
plt.xlabel('Nombre de personnes')
plt.ylabel('Niveau d\'étude')
plt.title('Répartition du niveau d\'étude - {}'.format(academie))
plt.show()
def plot_formation_par_academie(df, academie):
formation_counts = df[df['Académie'] == academie]['Type Formation - Libellé 2022/2023'].value_counts()
plt.figure(figsize=(10, 8))
formation_counts.plot(kind='barh')
plt.xlabel('Nombre de personnes')
plt.ylabel('Type de formation')
plt.title('Répartition du type de formation - {}'.format(academie))
plt.show()
# Boucle pour créer les diagrammes pour chaque académie
for academie in academies:
plot_etude_par_academie(df, academie)
plot_formation_par_academie(df, academie)
# Comptage des formations
etude_counts = df[' Niveau Etude - Libellé 2022/2023'].value_counts()
# Tracé des diagrammes circulaires
plt.figure(figsize=(10, 8))
etude_counts.plot(kind='barh')
plt.xlabel('Nombre de personnes')
plt.ylabel('Niveau d\'étude')
plt.title('Répartition du niveau d\'étude')
plt.show()
# Comptage des formations
formation_counts = df['Type Formation - Libellé 2022/2023'].value_counts()
# Tracé du diagramme à barres horizontal
plt.figure(figsize=(10, 8))
formation_counts.plot(kind='barh')
plt.xlabel('Nombre de personnes')
plt.ylabel('Type de formation')
plt.title('Répartition du type de formation')
plt.show()
def plot_moyenne_par_academie(df, colonne_moyenne):
# Liste des académies
academies = [academie for academie in df['Académie'].unique() if academie is not None]
# Initialiser une liste pour stocker les moyennes par académie
moyennes_par_academie = []
# Calculer la moyenne pour chaque académie
for academie in academies:
# Sélectionner les valeurs numériques dans la colonne
valeurs_numeriques = df[(df['Académie'] == academie) & pd.to_numeric(df[colonne_moyenne], errors='coerce').notna()][colonne_moyenne]
moyenne_academie = np.mean(valeurs_numeriques)
moyennes_par_academie.append(moyenne_academie)
# Créer le graphique à barres
plt.figure(figsize=(10, 6))
barplot = plt.bar(academies, moyennes_par_academie, color='skyblue')
plt.title(f'{colonne_moyenne} par académie')
plt.xlabel('Académie')
plt.ylabel('Moyenne')
plt.xticks(rotation=45, ha='right')
# Ajouter les valeurs au-dessus des barres
for i, bar in enumerate(barplot):
plt.text(bar.get_x() + bar.get_width() / 2, bar.get_height() + 0.05, round(moyennes_par_academie[i], 2), ha='center')
plt.tight_layout()
plt.show()
Exemple d'utilisation :
plot_moyenne_par_academie(df, "Moyenne du Candidat en Systemes d''information et numerique pour trimestre 1")
plot_moyenne_par_academie(df, "Moyenne du Candidat en Numérique et Sciences Informatiques pour trimestre 1")
plot_moyenne_par_academie(df, "Moyenne du Candidat en Enseignement scientifique pour trimestre 1")
plot_moyenne_par_academie(df, "Moyenne du Candidat en Sciences de l'ingénieur pour trimestre 1")
plot_moyenne_par_academie(df, "Moyenne du Candidat en Mathématiques pour trimestre 1")
plot_moyenne_par_academie(df, "Moyenne du Candidat en Mathématiques Expertes pour trimestre 1")
plot_moyenne_par_academie(df, "Moyenne du Candidat en Mathématiques Complémentaires pour trimestre 1")
plot_moyenne_par_academie(df, "Moyenne du Candidat en Mathématiques Spécialité pour trimestre 1")
plot_moyenne_par_academie(df, "Moyenne du Candidat en Physique-Chimie et Mathématiques pour trimestre 1")
plot_moyenne_par_academie(df, "Moyenne du Candidat en Langue vivante A pour trimestre 1")
plot_moyenne_par_academie(df, "Moyenne du Candidat en Systemes d''information et numerique pour trimestre 2")
plot_moyenne_par_academie(df, "Moyenne du Candidat en Numérique et Sciences Informatiques pour trimestre 2")
plot_moyenne_par_academie(df, "Moyenne du Candidat en Enseignement scientifique pour trimestre 2")
plot_moyenne_par_academie(df, "Moyenne du Candidat en Sciences de l'ingénieur pour trimestre 2")
plot_moyenne_par_academie(df, "Moyenne du Candidat en Mathématiques pour trimestre 2")
plot_moyenne_par_academie(df, "Moyenne du Candidat en Mathématiques Expertes pour trimestre 2")
plot_moyenne_par_academie(df, "Moyenne du Candidat en Mathématiques Complémentaires pour trimestre 2")
plot_moyenne_par_academie(df, "Moyenne du Candidat en Mathématiques Spécialité pour trimestre 2")
plot_moyenne_par_academie(df, "Moyenne du Candidat en Physique-Chimie et Mathématiques pour trimestre 2")
plot_moyenne_par_academie(df, "Moyenne du Candidat en Langue vivante A pour trimestre 2")
plot_moyenne_par_academie(df, "Moyenne du Candidat en Systemes d''information et numerique pour trimestre 3")
plot_moyenne_par_academie(df, "Moyenne du Candidat en Numérique et Sciences Informatiques pour trimestre 3")
plot_moyenne_par_academie(df, "Moyenne du Candidat en Enseignement scientifique pour trimestre 3")
plot_moyenne_par_academie(df, "Moyenne du Candidat en Sciences de l'ingénieur pour trimestre 3")
plot_moyenne_par_academie(df, "Moyenne du Candidat en Mathématiques pour trimestre 3")
plot_moyenne_par_academie(df, "Moyenne du Candidat en Mathématiques Expertes pour trimestre 3")
plot_moyenne_par_academie(df, "Moyenne du Candidat en Mathématiques Complémentaires pour trimestre 3")
plot_moyenne_par_academie(df, "Moyenne du Candidat en Mathématiques Spécialité pour trimestre 3")
plot_moyenne_par_academie(df, "Moyenne du Candidat en Physique-Chimie et Mathématiques pour trimestre 3")
plot_moyenne_par_academie(df, "Moyenne du Candidat en Langue vivante A pour trimestre 3")
posx and posy should be finite values posx and posy should be finite values posx and posy should be finite values posx and posy should be finite values
df = pd.read_excel('RT_Anonyme.xlsx') #Nous prenons lisons le fichier excel que l'on nous a fourni
df = pd.DataFrame(df)
# Dictionnaire associant les deux premiers chiffres du code postal à l'académie correspondante
codepostal_academie = {
'75': 'Académie de Paris',
'77': 'Académie de Créteil',
'78': 'Académie de Versailles',
'91': 'Académie de Versailles',
'92': 'Académie de Versailles',
'93': 'Académie de Créteil',
'94': 'Académie de Créteil',
'95': 'Académie de Versailles'
}
# Fonction pour obtenir l'académie à partir du code postal
def get_academie_from_codepostal(codepostal):
if pd.notnull(codepostal):
codepostal = str(codepostal)[:2]
return codepostal_academie.get(codepostal, 'Autre')
return None
# Ajout de la colonne "Académie" au DataFrame
df['Académie'] = df['Commune Etablissement origine - CodePostal 2021/2022'].apply(get_academie_from_codepostal)
Traitons maintenant les corrélations.
Nous pensons qu'il y a une corrélation entre l'académie de provenance et le statut de boursier.
Nous souhaitons donc savoir si il y a plus de boursier en provenance de l'académie de Créteil ou non, car l'académie de Créteil regroupe trois départements : Seine-et-Marne (77), Seine-Saint-Denis (93) et Val-de-Marne (94). La Seine-Saint-Denis étant le département le plus pauvre de France, devrait logiquement accorder des bourses aux étudiants.
# Filtrer les lignes avec des bénéficiaires de bourses
boursiers_df = df[(df['Candidat boursier - Libellé'] != 'Non boursier') & (df['Candidat boursier - Libellé'].notna())]
# Compter le nombre de bénéficiaires de bourses par académie
boursiers_par_academie = boursiers_df['Académie'].value_counts()
# Afficher les bénéficiaires de bourses par académie
print(boursiers_par_academie)
# Affichez l'académie ayant le plus grand nombre de bénéficiaires de bourses
if not boursiers_par_academie.empty:
academie_max_boursiers = boursiers_par_academie.idxmax()
print("\nL'académie avec le plus grand nombre de bénéficiaires de bourses est :", academie_max_boursiers)
else:
print("\nIl n'y a aucun bénéficiaire de bourses dans le DataFrame.")
Académie de Créteil 486 Académie de Versailles 325 Académie de Paris 90 Autre 88 Name: Académie, dtype: int64 L'académie avec le plus grand nombre de bénéficiaires de bourses est : Académie de Créteil
Il y a donc bel et bien une corrélation entre l'académie de provenance et le statut de boursier. Notons par ailleurs que si l'on additionne les boursiers des autres académies, l'on tombe à 503, qui est à peine plus grand que l'académie de Créteil qui est à 486.
Et voici la démonstration mathématiques !
# Créez un tableau croisé des fréquences observées entre l'académie et le statut de boursier
cross_tab = pd.crosstab(df['Académie'], df['Candidat boursier - Libellé'])
# Effectuez le test du chi carré
chi2, p_value, _, _ = chi2_contingency(cross_tab)
# Interprétez les résultats
print("Test du khi carré :")
print("Statistique de test (khi carré) :", chi2)
print("p-value :", p_value)
if p_value < 0.05:
print("Il y a une association significative entre l'académie et le statut de boursier.")
else:
print("Il n'y a pas suffisamment de preuves pour conclure à une association significative entre l'académie et le statut de boursier.")
Test du khi carré : Statistique de test (khi carré) : 63.27464354042711 p-value : 9.702692908840457e-12 Il y a une association significative entre l'académie et le statut de boursier.
Nous pensons que la moyenne d'enseignement scienfique influe sur les mathématiques. L'académie avec les meilleurs résultats en Enseignement scientifique sera la meilleure dans les matières mathématiques.
# Création des DataFrames pour chaque matière
enseignement_scientifique_df = pd.DataFrame({
'Académie': ['Autre', 'Académie de Paris', 'Académie de Créteil', 'Académie de Versailles'],
'Moyenne': [14.112440, 13.366283, 13.285377, 13.259594]
})
mathematiques_df = pd.DataFrame({
'Académie': ['Autre', 'Académie de Créteil', 'Académie de Paris', 'Académie de Versailles'],
'Moyenne': [11.889492, 11.698496, 11.610811, 11.043252]
})
math_expertes_df = pd.DataFrame({
'Académie': ['Académie de Versailles', 'Autre', 'Académie de Paris', 'Académie de Créteil'],
'Moyenne': [12.970000, 11.372222, 10.803333, 10.357353]
})
math_complementaires_df = pd.DataFrame({
'Académie': ['Autre', 'Académie de Créteil', 'Académie de Paris', 'Académie de Versailles'],
'Moyenne': [11.615122, 10.731545, 10.556322, 9.956950]
})
math_specialites_df = pd.DataFrame({
'Académie': ['Autre', 'Académie de Créteil', 'Académie de Paris', 'Académie de Versailles'],
'Moyenne': [12.740244, 12.012500, 11.894000, 11.865714]
})
# Concaténation des DataFrames
df = pd.concat([enseignement_scientifique_df, mathematiques_df['Moyenne'], math_expertes_df['Moyenne'],
math_complementaires_df['Moyenne'], math_specialites_df['Moyenne']], axis=1)
df.columns = ['Académie', 'Moyenne_Enseignement_Scientifique', 'Moyenne_Mathématiques', 'Moyenne_Mathématiques_Experts',
'Moyenne_Mathématiques_Complémentaires', 'Moyenne_Mathématiques_Spécialités']
# Calcul de la corrélation
correlation_ens_math = df['Moyenne_Enseignement_Scientifique'].corr(df['Moyenne_Mathématiques'])
correlation_ens_math_experts = df['Moyenne_Enseignement_Scientifique'].corr(df['Moyenne_Mathématiques_Experts'])
correlation_ens_math_complementaires = df['Moyenne_Enseignement_Scientifique'].corr(df['Moyenne_Mathématiques_Complémentaires'])
correlation_ens_math_specialites = df['Moyenne_Enseignement_Scientifique'].corr(df['Moyenne_Mathématiques_Spécialités'])
# Affichage des classements des académies pour chaque matière
print("Classement Enseignement Scientifique:")
print(enseignement_scientifique_df)
print("\nClassement Mathématiques:")
print(mathematiques_df)
print("\nClassement Mathématiques Experts:")
print(math_expertes_df)
print("\nClassement Mathématiques Complémentaires:")
print(math_complementaires_df)
print("\nClassement Mathématiques Spécialités:")
print(math_specialites_df)
# Affichage des corrélations
print("\nCorrélation entre la moyenne de l'Enseignement scientifique et la moyenne des mathématiques :", correlation_ens_math)
print("Corrélation entre la moyenne de l'Enseignement scientifique et la moyenne des mathématiques experts :", correlation_ens_math_experts)
print("Corrélation entre la moyenne de l'Enseignement scientifique et la moyenne des mathématiques complémentaires :", correlation_ens_math_complementaires)
print("Corrélation entre la moyenne de l'Enseignement scientifique et la moyenne des mathématiques spécialités :", correlation_ens_math_specialites)
Classement Enseignement Scientifique:
Académie Moyenne
0 Autre 14.112440
1 Académie de Paris 13.366283
2 Académie de Créteil 13.285377
3 Académie de Versailles 13.259594
Classement Mathématiques:
Académie Moyenne
0 Autre 11.889492
1 Académie de Créteil 11.698496
2 Académie de Paris 11.610811
3 Académie de Versailles 11.043252
Classement Mathématiques Experts:
Académie Moyenne
0 Académie de Versailles 12.970000
1 Autre 11.372222
2 Académie de Paris 10.803333
3 Académie de Créteil 10.357353
Classement Mathématiques Complémentaires:
Académie Moyenne
0 Autre 11.615122
1 Académie de Créteil 10.731545
2 Académie de Paris 10.556322
3 Académie de Versailles 9.956950
Classement Mathématiques Spécialités:
Académie Moyenne
0 Autre 12.740244
1 Académie de Créteil 12.012500
2 Académie de Paris 11.894000
3 Académie de Versailles 11.865714
Corrélation entre la moyenne de l'Enseignement scientifique et la moyenne des mathématiques : 0.6676111966533191
Corrélation entre la moyenne de l'Enseignement scientifique et la moyenne des mathématiques experts : 0.9652586353373658
Corrélation entre la moyenne de l'Enseignement scientifique et la moyenne des mathématiques complémentaires : 0.9144635140018308
Corrélation entre la moyenne de l'Enseignement scientifique et la moyenne des mathématiques spécialités : 0.9990689513437607
Il y a une corrélation modérée positive (0.67) entre la moyenne en Enseignement Scientifique et la moyenne en Mathématiques. Cela suggère que les étudiants qui réussissent bien en Enseignement Scientifique ont tendance à bien réussir aussi en Mathématiques.
Il y a une corrélation très forte positive (0.97) entre la moyenne en Enseignement Scientifique et la moyenne en Mathématiques Experts. Cela indique une forte association entre les performances dans ces deux matières.
Il y a une corrélation forte positive (0.91) entre la moyenne en Enseignement Scientifique et la moyenne en Mathématiques Complémentaires. Encore une fois, cela montre une association significative entre les performances dans ces deux matières.
Il y a une corrélation extrêmement forte positive (0.99) entre la moyenne en Enseignement Scientifique et la moyenne en Mathématiques Spécialités. Cela suggère une association pratiquement parfaite entre les performances dans ces deux matières.
Ces résultats indiquent que la performance en Enseignement Scientifique est fortement liée aux performances dans les autres matières, avec des degrés de corrélation variables mais généralement positifs.
Nous pensons que les gens avec un bon niveau en mathématiques ont plus tendance à valider leurs voeux que les autres.
#Notre df a été modifié, donc on en reprend un vierge pour cette corrélation.
df = pd.read_excel('RT_Anonyme.xlsx') #Nous prenons lisons le fichier excel que l'on nous a fourni
df = pd.DataFrame(df)
# Dictionnaire associant les deux premiers chiffres du code postal à l'académie correspondante
codepostal_academie = {
'75': 'Académie de Paris',
'77': 'Académie de Créteil',
'78': 'Académie de Versailles',
'91': 'Académie de Versailles',
'92': 'Académie de Versailles',
'93': 'Académie de Créteil',
'94': 'Académie de Créteil',
'95': 'Académie de Versailles'
}
# Fonction pour obtenir l'académie à partir du code postal
def get_academie_from_codepostal(codepostal):
if pd.notnull(codepostal):
codepostal = str(codepostal)[:2]
return codepostal_academie.get(codepostal, 'Autre')
return None
# Ajout de la colonne "Académie" au DataFrame
df['Académie'] = df['Commune Etablissement origine - CodePostal 2021/2022'].apply(get_academie_from_codepostal)
# Colonnes de moyennes de mathématiques pour les 3 trimestres
math_columns = ["Moyenne du Candidat en Mathématiques pour trimestre 1",
"Moyenne du Candidat en Mathématiques pour trimestre 2",
"Moyenne du Candidat en Mathématiques pour trimestre 3",
"Moyenne du Candidat en Mathématiques Expertes pour trimestre 1",
"Moyenne du Candidat en Mathématiques Expertes pour trimestre 2",
"Moyenne du Candidat en Mathématiques Expertes pour trimestre 3",
"Moyenne du Candidat en Mathématiques Complémentaires pour trimestre 1",
"Moyenne du Candidat en Mathématiques Complémentaires pour trimestre 2",
"Moyenne du Candidat en Mathématiques Complémentaires pour trimestre 3",
"Moyenne du Candidat en Mathématiques Spécialité pour trimestre 1",
"Moyenne du Candidat en Mathématiques Spécialité pour trimestre 2",
"Moyenne du Candidat en Mathématiques Spécialité pour trimestre 3"]
# Convertir les colonnes de moyennes de mathématiques en type numérique
for col in math_columns:
df[col] = pd.to_numeric(df[col], errors='coerce') # Convertir en numérique
# Filtrer les notes supérieures à 14 dans chaque colonne de moyennes de mathématiques
for col in math_columns:
df[col] = df[col].apply(lambda x: x if x > 14 else np.nan)
# Calculer la moyenne des mathématiques pour chaque candidat pour les 3 trimestres
df['Moyenne Mathématiques'] = df[math_columns].mean(axis=1)
# Remplacer les valeurs de la colonne 'Vœu confirmé - Libellé' par 1 si validé et 0 sinon
df['Voeu_Valide'] = df['Vœu confirmé - Libellé'].map({'Validée': 1, 'Non validée': 0})
# Examinez la corrélation entre la moyenne des mathématiques et la validation des vœux
correlation = df['Moyenne Mathématiques'].corr(df['Voeu_Valide'])
print("Corrélation entre la moyenne des mathématiques et la validation des vœux :", correlation)
Corrélation entre la moyenne des mathématiques et la validation des vœux : 0.031324342299065416
Nous obtenons un coefficent de corrélation de 0.03132434229906544 ce qui indique une faible corrélation positive. Il y a une légère tendance à ce que les candidats ayant de meilleures notes en mathématiques aient une probabilité légèrement plus élevée de valider leurs vœux par rapport à ceux ayant des notes moins élevées.
La fonction normalize semble implémenter une méthode de normalisation des notes d'étudiants. Cette méthode prend en compte la moyenne de la classe (m), la moyenne de l'étudiant (e), ainsi que les notes minimales (mi) et maximales (ma) de la classe pour une matière donnée. La normalisation est effectuée en ajustant les notes de manière à ce qu'elles se situent dans une plage de valeurs prédéterminée. Cela peut être utile pour comparer les performances des étudiants sur différentes matières, en prenant en compte les variations de difficulté entre les matières et entre les classes.
La fonction calculNote prend en compte les moyennes de l'étudiant, de la classe, ainsi que les notes minimales et maximales de la classe pour calculer la note de l'étudiant dans une matière donnée et pour un trimestre donné. Cette note est calculée en fonction des performances de l'étudiant par rapport à la moyenne de la classe, avec une éventuelle normalisation. Cette approche permet d'évaluer les performances individuelles des étudiants de manière relative par rapport à leur classe.
La fonction calculScore calcule un score global pour chaque étudiant, en prenant en compte les performances dans plusieurs matières et pour plusieurs trimestres. Ce score est calculé en agrégeant les notes calculées pour chaque matière, en fonction des coefficients attribués à chaque matière. Les matières peuvent avoir des coefficients différents selon leur importance relative dans le calcul du score global. Ce score peut être utilisé pour classer les étudiants en fonction de leurs performances globales.
Les matrices matrice_general et matrice_sti2d définissent les coefficients et les plages de notes associées à chaque matière. Ces informations sont utilisées dans le calcul des scores des étudiants pour pondérer les performances dans différentes matières et pour déterminer si les notes sont supérieures à des seuils prédéfinis.
# Matrices pour les coeffs et notes planches
matrice_general = pd.DataFrame(
{
'Mathématiques Spécialité': [5, 8],
'Mathématiques Expertes': [3, 6],
'Mathématiques Complémentaires': [7, 7],
'Enseignement scientifique': [4, 7],
#'Informatique et Sciences du numérique': [6, 8],
'Anglais': [2, 8],
'Français': [3, 7]
},
index=["Coeff", "Planche"]
)
matrice_sti2d = pd.DataFrame(
{
'Mathématiques': [5, 10],
'Physique-Chimie et Mathématiques': [4, 7],
'Systemes d\'\'information et numerique': [5, 8],
'Anglais': [2, 8],
'Français': [3, 8]
},
index=["Coeff", "Planche"]
)
# Affichage de la première matrice
print("Matrice pour les bacs généraux :")
print(matrice_general)
print("\n")
# Affichage de la deuxième matrice
print("Matrice pour les bacs technologiques :")
print(matrice_sti2d)
Matrice pour les bacs généraux :
Mathématiques Spécialité Mathématiques Expertes \
Coeff 5 3
Planche 8 6
Mathématiques Complémentaires Enseignement scientifique Anglais \
Coeff 7 4 2
Planche 7 7 8
Français
Coeff 3
Planche 7
Matrice pour les bacs technologiques :
Mathématiques Physique-Chimie et Mathématiques \
Coeff 5 4
Planche 10 7
Systemes d''information et numerique Anglais Français
Coeff 5 2 3
Planche 8 8 8
Nos critères pour le classement sont tout simplement les notes. Nous prenons les notes des matières scientifiques ainsi que le Français et l'Anglais
# Valeurs optimales selon la demonstration sur ataraxy
def normalize(e, m, mi, ma):
return 6.22 * (e - m) / (ma - mi) + 10.02
# Calcul la note de l'etudiant pour matiere mat au trimestre tri
# Il faut passer les arguments en chaine de caracteres formates correctement
def calculNote(df, i, mat, tri):
if mat == "Anglais":
if df["Langue vivante A scolarité - Libellé 2022/2023"][i] == "Anglais" or df["Langue vivante A scolarité - Libellé 2021/2022"][i] == "Anglais" or df["Langue vivante A scolarité - Libellé 2020/2021"][i] == "Anglais":
mat = "Langue vivante A"
else:
mat = "Langue vivante B"
e = df["Moyenne du Candidat en " + mat + " pour " + tri][i]
m = df["Moyenne classe Candidat en " + mat + " pour " + tri][i]
mi = df["Moyenne Basse Classe du Candidat en " + mat + " pour " + tri][i]
ma = df["Moyenne Haute Classe du Candidat en " + mat + " pour " + tri][i]
if math.isnan(e):
return None
if math.isnan(m) or math.isnan(mi) or math.isnan(ma):
return 10.22
return normalize(e, m, mi, ma)
# Verifie qu'un candidat de filiere generale possede au moins une mathiere de maths
def createOptionDict(df, i):
options = {}
annees = ["2020/2021", "2021/2022", "2022/2023"]
for annee in annees:
for j in range(1, 5):
temp = "Option facultative " + str(j) + " Scolarité - Libellé " + annee
option = df[temp][i]
options[temp] = (option)
# for option in options.values():
# if "Mathématiques" in option:
# return True
return options
def calculScore(df, i, matrice):
res = None
t = 0
for mat, arr in matrice.items():
for tri, c in triDict.items():
note = calculNote(df, i, mat, tri)
if note is None:
if mat == "Mathématiques":
return None
else:
break
else:
# Si le resultat n'a pas ete initialise on s'en occupe
if res is None:
res = 0
# Si la note est inferieure a la planche on ne classe pas
if note < matrice[mat]["Planche"]:
return None
coeff = matrice[mat]["Coeff"] * c
res += note * coeff
t += coeff
if t != 0 and res is not None:
res /= t
return res
############################################################################
df = pd.read_excel("RT_Anonyme.xlsx")
print(df.info)
# Ecriture des noms de colonnes vers un fichier pour analyse manuelle
column_list = df.columns.tolist()
i = 0
with open("column_names", 'w') as file:
for column_name in column_list:
file.write(f"{i} {column_name}\n")
i += 1
# Conversion de certaines colonnes en donnees numeriques
colonnesNumeriques = df.columns[68:998]
df[colonnesNumeriques] = df[colonnesNumeriques].apply(pd.to_numeric, errors='coerce')
# Coeffs par trimestre
triDict = {
"trimestre 1": 1,
"trimestre 2": 1.05,
"trimestre 3": 1.1,
"trimestre 1.1": 1.15,
"trimestre 2.1": 1.2,
"trimestre 3.1": 1
}
# Matrices pour les coeffs et notes planches
matrice_general = pd.DataFrame(
{
'Mathématiques Spécialité': [5, 8],
'Mathématiques Expertes': [3, 6],
'Mathématiques Complémentaires': [7, 7],
'Enseignement scientifique': [4, 7],
'Numérique et Sciences Informatiques': [6, 8],
'Anglais': [2, 8],
'Français': [3, 7]
},
index=["Coeff", "Planche"]
)
matrice_sti2d = pd.DataFrame(
{
'Mathématiques': [5, 10],
'Physique-Chimie et Mathématiques': [4, 7],
'Systemes d\'\'information et numerique': [5, 8],
'Anglais': [2, 8],
'Français': [3, 8]
},
index=["Coeff", "Planche"]
)
# Nouvelle colonne classement
df["Classement Perso"] = [-1 for x in range(0, 2520)]
# Initialisation du "score" -> moyenne de l'etudiant apres normalisation etc
df["Score"] = [0 for x in range(0, 2520)]
for i in range(len(df)):
if df["Groupe candidat - Code"][i] == 10600:
options = createOptionDict(df, i)
# Si le candidat n'a pas de notes de Maths il n'est pas classe
if "Mathématiques" not in options:
df["Score"][i] = None
df["Classement Perso"][i] = -1
df["Score"][i] = calculScore(df, i, matrice_general)
if df["Groupe candidat - Code"][i] == 142310:
df["Score"][i] = calculScore(df, i, matrice_sti2d)
########################
# On trim les candidats ou score est None
df1 = df[df['Score'].notna()]
df2 = df1[df1['Classement Perso'] != 1]
df_classe = df2.sort_values(by='Score', ascending=False)
df_classe["Classement Perso"] = range(1, len(df_classe) + 1)
print(df_classe)
<bound method DataFrame.info of ID Groupe candidat - Code Classement Aménagement Sexe \
0 1 10600 NC NaN Masculin
1 2 10600 NC NaN Masculin
2 3 142310 469 NaN Masculin
3 4 10600 NC NaN Masculin
4 5 10600 NC NaN Masculin
... ... ... ... ... ...
2515 2516 10600 NC NaN Masculin
2516 2517 10600 482 NaN Masculin
2517 2518 10600 NC NaN Masculin
2518 2519 10600 495 NaN Masculin
2519 2520 10600 NC NaN Masculin
Candidat boursier - Libellé Année Scolaire - Libellé 2022/2023 \
0 Boursier de l'enseignement supérieur 2022-2023
1 Non boursier 2022-2023
2 Boursier de l'enseignement supérieur 2022-2023
3 Boursier de l'enseignement supérieur 2022-2023
4 Non boursier 2022-2023
... ... ...
2515 Boursier de l'enseignement scolaire 2022-2023
2516 Non boursier 2022-2023
2517 Non boursier 2022-2023
2518 Boursier de l'enseignement scolaire 2022-2023
2519 Non boursier 2022-2023
Type de Scolarité - Libellé 2022/2023 Niveau Etude - Libellé 2022/2023 \
0 Scolarité française 1ère année d'études supérieures
1 Scolarité française 1ère année d'études supérieures
2 Scolarité française 1ère année d'études supérieures
3 Scolarité française 1ère année d'études supérieures
4 Scolarité française 1ère année d'études supérieures
... ... ...
2515 Scolarité française Terminale
2516 Scolarité française Terminale
2517 Scolarité française Terminale
2518 Scolarité française Terminale
2519 Scolarité française Terminale
Type Formation - Libellé 2022/2023 ... Note de l'épreuve.32 \
0 Diplômes d'université ou d'établissement ... NaN
1 Licence ... NaN
2 Licence ... NaN
3 BUT ... NaN
4 BUT ... NaN
... ... ... ...
2515 Terminale ... NaN
2516 Terminale ... NaN
2517 Terminale ... NaN
2518 Terminale ... NaN
2519 Terminale ... NaN
Epreuve - Libelle.33 Note de l'épreuve.33 Epreuve - Libelle.34 \
0 NaN NaN NaN
1 NaN NaN NaN
2 NaN NaN NaN
3 NaN NaN NaN
4 NaN NaN NaN
... ... ... ...
2515 NaN NaN NaN
2516 NaN NaN NaN
2517 NaN NaN NaN
2518 NaN NaN NaN
2519 NaN NaN NaN
Note de l'épreuve.34 Epreuve - Libelle.35 Note de l'épreuve.35 \
0 NaN NaN NaN
1 NaN NaN NaN
2 NaN NaN NaN
3 NaN NaN NaN
4 NaN NaN NaN
... ... ... ...
2515 NaN NaN NaN
2516 NaN NaN NaN
2517 NaN NaN NaN
2518 NaN NaN NaN
2519 NaN NaN NaN
Date sélection vœu Date confirmation vœu Vœu confirmé - Libellé
0 2023-03-04 19:16:00 2023-03-23 22:22:00 Validée
1 2023-03-02 03:16:00 2023-04-06 01:23:00 Validée
2 2023-03-09 23:38:00 2023-04-06 18:35:00 Validée
3 2023-03-09 23:13:00 2023-04-06 13:40:00 Validée
4 2023-03-05 19:09:00 2023-04-06 01:04:00 Validée
... ... ... ...
2515 2023-03-06 17:59:00 2023-03-29 10:18:00 Validée
2516 2023-03-03 19:11:00 2023-04-04 21:42:00 Validée
2517 2023-02-25 16:21:00 2023-04-04 20:59:00 Validée
2518 2023-03-05 22:43:00 2023-04-02 19:57:00 Validée
2519 2023-03-08 19:56:00 2023-04-04 21:47:00 Validée
[2520 rows x 1080 columns]>
ID Groupe candidat - Code Classement Aménagement Sexe \
1362 1363 142310 5 NaN Masculin
232 233 10600 NC NaN Masculin
789 790 142310 1 NaN Masculin
2168 2169 142310 103 NaN Masculin
1575 1576 142310 31 NaN Masculin
... ... ... ... ... ...
1206 1207 10600 ENCF NaN Féminin
2456 2457 10600 NC NaN Masculin
148 149 10600 313 NaN Masculin
2473 2474 10600 NC NaN Masculin
1541 1542 10600 ENCF NaN Masculin
Candidat boursier - Libellé Année Scolaire - Libellé 2022/2023 \
1362 Non boursier 2022-2023
232 Boursier de l'enseignement supérieur 2022-2023
789 Non boursier 2022-2023
2168 Non boursier 2022-2023
1575 Non boursier 2022-2023
... ... ...
1206 Non boursier 2022-2023
2456 Boursier de l'enseignement scolaire 2022-2023
148 Boursier de l'enseignement supérieur 2022-2023
2473 Boursier de l'enseignement scolaire 2022-2023
1541 Non boursier 2022-2023
Type de Scolarité - Libellé 2022/2023 \
1362 Scolarité française
232 Scolarité française
789 Scolarité française
2168 Scolarité française
1575 Scolarité française
... ...
1206 Scolarité française
2456 Scolarité française
148 Scolarité française
2473 Scolarité française
1541 Scolarité française
Niveau Etude - Libellé 2022/2023 \
1362 Terminale
232 1ère année d'études supérieures
789 Terminale
2168 Terminale
1575 Terminale
... ...
1206 Terminale
2456 Terminale
148 Année préparatoire aux études supérieures
2473 Terminale
1541 Terminale
Type Formation - Libellé 2022/2023 ... \
1362 Terminale ...
232 BUT ...
789 Terminale ...
2168 Terminale ...
1575 Terminale ...
... ... ...
1206 Terminale ...
2456 Terminale ...
148 Classe de remise à niveau (Scientifique, pour ... ...
2473 Terminale ...
1541 Terminale ...
Note de l'épreuve.33 Epreuve - Libelle.34 Note de l'épreuve.34 \
1362 NaN NaN NaN
232 NaN NaN NaN
789 NaN NaN NaN
2168 NaN NaN NaN
1575 NaN NaN NaN
... ... ... ...
1206 NaN NaN NaN
2456 NaN NaN NaN
148 NaN NaN NaN
2473 NaN NaN NaN
1541 NaN NaN NaN
Epreuve - Libelle.35 Note de l'épreuve.35 Date sélection vœu \
1362 NaN NaN 2023-02-21 15:44:00
232 NaN NaN 2023-03-09 20:35:00
789 NaN NaN 2023-03-04 20:01:00
2168 NaN NaN 2023-02-01 16:33:00
1575 NaN NaN 2023-03-02 17:32:00
... ... ... ...
1206 NaN NaN 2023-03-09 21:21:00
2456 NaN NaN 2023-03-09 22:28:00
148 NaN NaN 2023-03-07 16:58:00
2473 NaN NaN 2023-03-06 18:56:00
1541 NaN NaN 2023-03-06 22:38:00
Date confirmation vœu Vœu confirmé - Libellé Classement Perso Score
1362 2023-04-01 20:34:00 Validée 1 13.367158
232 2023-04-06 08:17:00 Validée 2 13.276567
789 2023-04-05 17:27:00 Validée 3 13.227627
2168 2023-04-04 14:13:00 Validée 4 12.828802
1575 2023-04-03 19:08:00 Validée 5 12.779726
... ... ... ... ...
1206 NaT Non validée 711 8.568507
2456 2023-04-06 22:58:00 Validée 712 8.409619
148 2023-04-06 20:45:00 Validée 713 8.391731
2473 2023-04-06 19:36:00 Validée 714 8.299893
1541 NaT Non validée 715 7.983947
[715 rows x 1082 columns]
# Afficher les 5 premiers du classement
print(df_classe.head(5))
ID Groupe candidat - Code Classement Aménagement Sexe \
1362 1363 142310 5 NaN Masculin
232 233 10600 NC NaN Masculin
789 790 142310 1 NaN Masculin
2168 2169 142310 103 NaN Masculin
1575 1576 142310 31 NaN Masculin
Candidat boursier - Libellé Année Scolaire - Libellé 2022/2023 \
1362 Non boursier 2022-2023
232 Boursier de l'enseignement supérieur 2022-2023
789 Non boursier 2022-2023
2168 Non boursier 2022-2023
1575 Non boursier 2022-2023
Type de Scolarité - Libellé 2022/2023 Niveau Etude - Libellé 2022/2023 \
1362 Scolarité française Terminale
232 Scolarité française 1ère année d'études supérieures
789 Scolarité française Terminale
2168 Scolarité française Terminale
1575 Scolarité française Terminale
Type Formation - Libellé 2022/2023 ... Note de l'épreuve.33 \
1362 Terminale ... NaN
232 BUT ... NaN
789 Terminale ... NaN
2168 Terminale ... NaN
1575 Terminale ... NaN
Epreuve - Libelle.34 Note de l'épreuve.34 Epreuve - Libelle.35 \
1362 NaN NaN NaN
232 NaN NaN NaN
789 NaN NaN NaN
2168 NaN NaN NaN
1575 NaN NaN NaN
Note de l'épreuve.35 Date sélection vœu Date confirmation vœu \
1362 NaN 2023-02-21 15:44:00 2023-04-01 20:34:00
232 NaN 2023-03-09 20:35:00 2023-04-06 08:17:00
789 NaN 2023-03-04 20:01:00 2023-04-05 17:27:00
2168 NaN 2023-02-01 16:33:00 2023-04-04 14:13:00
1575 NaN 2023-03-02 17:32:00 2023-04-03 19:08:00
Vœu confirmé - Libellé Classement Perso Score
1362 Validée 1 13.367158
232 Validée 2 13.276567
789 Validée 3 13.227627
2168 Validée 4 12.828802
1575 Validée 5 12.779726
[5 rows x 1082 columns]